const request = (options) => {
  return new Promise((resolve, reject) => {
    const {
      url,
      method = 'GET',
      data = {},
      header = {}
    } = options

    // 请求拦截器, 如果当前接口没有token头了再追加
    // 1. 获取当前的token 2. 添加到header上
    if (!header.Authorization) header.Authorization = 'Bearer ' + getApp().token
    wx.request({
      url: wx.http.baseURL + url,
      method,
      data,
      header,
      // 1.网络状态码成功的情况
      success: async (res) => {
        // 处理非200网络状态码
        if (res.statusCode !== 200) {
          // 特别特殊处理401，token失效，调接口，刷新token
          if (res.statusCode === 401) {
            // 401 处理，如果刷新token接口报401，去login重新登陆
            if (url.includes('refreshToken')) {
              const pages = getCurrentPages()
              const currentPage = pages[pages.length - 1]
              return wx.redirectTo({
                url: '/pages/login/index?redirectUrl=/' + currentPage.route,
              })
            }
            const app = getApp()
            const {
              token,
              refreshToken
            } = await wx.http({
              url: '/refreshToken',
              method: 'POST',
              header: {
                Authorization: 'Bearer ' + app.refreshToken
              }
            })
            // 存储token
            app.token = token
            app.refreshToken = refreshToken
            wx.setStorageSync('token', token)
            wx.setStorageSync('refreshToken', refreshToken)
            // 把出现的401错误，重新发起
            // 只有 刷新token的请求才自己单独追加Authorization，其它请求都是走封装函数追加
            const res = await wx.http({
              url,
              method,
              data
            })
            resolve(res)
            return
          } else {
            wx.toast(res.data.message)
            reject(res.data)
          }
        }


        const {
          data,
          code,
          message
        } = res.data
        // 1.2 业务失败的情况
        if (code !== 10000) {
          wx.toast(message || '网络异常，请重试')
          reject(res.data) // 返回更全数据，让后续再次处理失败时，有更多的信息可以使用
        } else {
          // 1.1 业务成功的情况
          resolve(data)
        }
        resolve(res)
      },
      // 2. 网络状态码失败的情况
      fail: (res) => {
        reject(res)
      },
      complete: () => {}
    })
  })
}
wx.http = request
wx.http.baseURL = 'https://live-api.itheima.net'